<template>
  <el-form>
    <el-row>
      <el-col :span="24">
        <el-form-item label="报表类型:">
          <CustomSelect
            :options="type_list"
            ref="report"
            v-if="template_show"
          ></CustomSelect>
        </el-form-item>
      </el-col>
    </el-row>
    <el-row>
      <el-col :span="24">
        <el-form-item label="公司列表:">
          <CustomSelect
            :options="company_list"
            ref="company"
            v-if="company_show"
          ></CustomSelect>
        </el-form-item>
      </el-col>
    </el-row>
    <el-row :span="24">
      <el-form-item>
        <el-button type="primary" @click="submit">
          生成报表
          <i class="el-icon-download el-icon--right"></i>
        </el-button>
      </el-form-item>
    </el-row>
  </el-form>
</template>

<script>
import CustomSelect from "@/components/CustomSelect.vue";
import XLSX from "xlsx";
export default {
  // eslint-disable-next-line vue/multi-word-component-names
  name: "Report",
  components: {
    CustomSelect,
  },
  data: function () {
    return {
      template_show: false,
      company_show: false,
      metadata: [], // 所有元数据
      metadata_subsidiary: [], // 含有子公司的模板集合
      doc_lib_arr: [], // 除了个人文档库以外的文档库集合
      type_list: [
        {
          id: "模板key", // 模板key
          value: "模板名称", // 模板名称
          subsidiary_key: "子公司key", // field子公司key
          disable: false,
        },
      ],
      company_list: [
        {
          id: "0",
          value: "云南通威",
          disable: false,
        },
      ],
    };
  },
  methods: {
    async submit() {
      if (this.$refs.report.checkedTypes.length === 0) {
        this.$microWidgetProps.components.toast.error("请选择报表类型");
        return false;
      }

      if (this.$refs.company.checkedTypes.length === 0) {
        this.$microWidgetProps.components.toast.error("请选择子公司");
        return false;
      }

      const checked_report = [];
      const checked_company = [];

      // this.$refs.report.checkedTypes:['template_7ow1zfn9a', 'template_2pzkz09vubk']
      for (let i = 0; i < this.$refs.report.checkedTypes.length; i++) {
        for (let n = 0; n < this.type_list.length; n++) {
          if (this.$refs.report.checkedTypes[i] === this.type_list[n]["id"]) {
            checked_report.push(this.type_list[n]);
          }
        }
      }

      // this.$refs.company.checkedTypes: [2, 3]
      for (let i = 0; i < this.$refs.company.checkedTypes.length; i++) {
        for (let n = 0; n < this.company_list.length; n++) {
          if (
            this.$refs.company.checkedTypes[i] == this.company_list[n]["id"]
          ) {
            checked_company.push({
              id: this.company_list[n]["id"],
              value: this.company_list[n]["value"],
            });
          }
        }
      }

      try {
        for (let i = 0; i < checked_company.length; i++) {
          // ===============================xlsx数据========================================
          const wb = XLSX.utils.book_new();

          for (let n = 0; n < checked_report.length; n++) {
            // 获取模板下所有文档信息（basename、docid）
            let get_file_res = await this.axios
              .post("/api/ecosearch/v1/file-search", {
                condition: {},
                custom: [
                  {
                    isTemplate: true,
                    scope: "aishu",
                    key: checked_report[n]["subsidiary_key"], // field字段名称
                    mode: "=",
                    type: "enum",
                    template: checked_report[n]["id"], // 模板名称
                    value: [checked_company[i]["value"]],
                  },
                ],
                dimension: [],
                keyword: "",
                range: this.doc_lib_arr, // 在除个人文档库以外的文档库中搜索
                rows: 50,
                start: 0,
                type: "doc",
              })
              .then((get_file_res) => [null, get_file_res])
              .catch((err) => [err, null]);

            if (!get_file_res[1]) {
              // microWidgetProps.components.toast.error(JSON.stringify(get_info_by_path[1]));
              this.$microWidgetProps.components.toast.error(
                JSON.stringify(get_file_res[1])
              );
              return false;
            }

            get_file_res = get_file_res[1];

            // 获取根据子公司和模板查询到的docid
            if (get_file_res.data.files.length != 0) {
              // ===============================xlsx数据========================================
              const current_company_template_file_arr = [];

              // 用模板key从metadata-all查出其所有fields的key和display_name，并把display_name存入metadata_fields_name
              let metadata_fields_name = ["序号", "文件名称"];
              for (let m = 0; m < this.metadata.length; m++) {
                if (this.metadata[m]["key"] === checked_report[n]["id"]) {
                  for (let k = 0; k < this.metadata[m]["fields"].length; k++) {
                    metadata_fields_name.push(
                      this.metadata[m]["fields"][k]["display_name"]
                    );
                  }
                }
              }

              metadata_fields_name = metadata_fields_name.concat([
                "路径1",
                "路径2",
                "路径3",
                "路径4",
                "路径5",
                "路径6",
                "路径7",
                "路径8",
                "路径9",
                "路径10",
              ]);

              // 1、将匹配的模板下的所有fields name存入current_company_template_file_arr
              current_company_template_file_arr.push(metadata_fields_name);

              /////////////////////////////////////////////////////获取当前子公司、当前模板下的所有文档属性存入current_company_template_file_arr////////////////////////////////////////////////////////////
              for (let i = 0; i < get_file_res.data.files.length; i++) {
                const doc_id = get_file_res.data.files[i]["doc_id"];
                const file_id = doc_id.substring(doc_id.lastIndexOf("/") + 1);

                // 存储获取到的当前文档的属性值
                const current_file_value = [];
                current_file_value.push(i + 1);
                current_file_value.push(
                  get_file_res.data.files[i]["basename"] +
                    get_file_res.data.files[i]["extension"]
                );

                // 获取文件属性 >>>>>>>>>>>>>>>>
                let file_item_res = await this.axios
                  .get(`/api/metadata/v1/item/${file_id}/mdata`)
                  .then((file_item_res) => [null, file_item_res])
                  .catch((err) => [err, null]);

                if (!file_item_res[1]) {
                  // microWidgetProps.components.toast.error(JSON.stringify(name_path[1]));
                  this.$microWidgetProps.components.toast.error(
                    JSON.stringify(file_item_res[1])
                  );
                  return false;
                }

                file_item_res = file_item_res[1];

                console.log(
                  "file_item_res.data.entries：查询到的单个文件所有模板下的所有fidles信息（数组）"
                );
                console.log(file_item_res.data.entries);

                // 找出当前文档所有属性中与当前模板相关的属性
                let file_current_template_fields;
                for (let m = 0; m < file_item_res.data.entries.length; m++) {
                  if (
                    file_item_res.data.entries[m]["template_key"] ===
                    checked_report[n]["id"]
                  ) {
                    file_current_template_fields =
                      file_item_res.data.entries[m];
                  }
                }
                console.log("file_current_template_fields");
                console.log(file_current_template_fields);

                // 找出当前模板对应的所有fields（数组）
                let current_template_fields;
                for (let m = 0; m < this.metadata.length; m++) {
                  if (this.metadata[m]["key"] === checked_report[n]["id"]) {
                    current_template_fields = this.metadata[m]["fields"];
                  }
                }

                // 将当前文档所有属性中与当前模板相关的属性与当前模板对应的所有fields比对，并且把相关值存入
                for (let s = 0; s < current_template_fields.length; s++) {
                  for (let key in file_current_template_fields) {
                    if (current_template_fields[s]["key"] === key) {
                      if (file_current_template_fields[key]) {
                        // 判断是否为日期时间
                        if (
                          file_current_template_fields[key].toString()
                            .length === 20 &&
                          file_current_template_fields[key]
                            .toString()
                            .indexOf("T") === 10 &&
                          file_current_template_fields[key]
                            .toString()
                            .indexOf("Z") === 19
                        ) {
                          current_file_value.push(
                            file_current_template_fields[key]
                              .toString()
                              .substring(0, 10)
                          );
                        } else {
                          current_file_value.push(
                            file_current_template_fields[key].toString()
                          );
                        }
                      } else {
                        current_file_value.push("");
                      }
                    }
                  }
                }

                let name_path = await this.axios
                  .post(`/api/efast/v1/file/convertpath`, {
                    docid: doc_id,
                  })
                  .then((name_path) => [null, name_path])
                  .catch((err) => [err, null]);

                if (!name_path[1]) {
                  // microWidgetProps.components.toast.error(JSON.stringify(name_path[1]));
                  this.$microWidgetProps.components.toast.error(
                    JSON.stringify(name_path[1])
                  );
                  return false;
                }

                name_path = name_path[1];
                const name_path_split = name_path.data.namepath.split("/");
                name_path_split.splice(name_path_split.length - 1, 1);

                for (let i = 0; i < 10; i++) {
                  if (name_path_split[i]) {
                    current_file_value.push(name_path_split[i]);
                  }
                }

                console.log("name_path");
                console.log(name_path);

                // 2、将当前子公司、当前模板下的所有文档属性存入current_company_template_file_arr，组成excel的一个sheet
                current_company_template_file_arr.push(current_file_value);
                // 获取文件属性 >>>>>>>>>>>>>>>
              }
              ///////////////////////////////////////////////////获取当前子公司、当前模板下的所有文档属性存入current_company_template_file_arr//////////////////////////////////////////////////////////////

              const ws = XLSX.utils.aoa_to_sheet(
                current_company_template_file_arr
              );

              // 每列不同宽度px
              const wscols = [{ wch: 5 }, { wch: 60 }, { wch: 20 }, { wch: 15 }, { wch: 15 }, { wch: 15 }, { wch: 15 }, { wch: 15 }, { wch: 15 }, { wch: 15 }, { wch: 15 }, { wch: 15 }, { wch: 15 }, { wch: 15 }, { wch: 15 }, { wch: 15 }, { wch: 15 }, { wch: 15 }, { wch: 15 }, { wch: 15 }, { wch: 15 }, { wch: 15 }, { wch: 15 }];

              ws["!cols"] = wscols;

              /* generate workbook and add the worksheet */
              XLSX.utils.book_append_sheet(wb, ws, checked_report[n]["value"]);
            } else {
              this.$microWidgetProps.components.toast.info(
                `【${checked_company[i]["value"]}】下【${checked_report[n]["value"]}】模板中无数据。`
              );
            }

            console.log("get_file_res");
            console.log(get_file_res);
          }

          console.log("wb");
          console.log(wb);

          if (wb["SheetNames"].length > 0) {
            XLSX.writeFile(wb, `${checked_company[i]["value"]}.xlsx`);
          }
        }
      } catch (error) {
        console.log(error);
      }
    },
    async getFileItem(file_id) {
      let file_item = await this.axios
        .get(`/api/metadata/v1/item/${file_id}/mdata`)
        .then((file_item) => [null, file_item])
        .catch((err) => [err, null]);

      if (!file_item[1]) {
        // microWidgetProps.components.toast.error(JSON.stringify(name_path[1]));
        this.$microWidgetProps.components.toast.error(
          JSON.stringify(file_item[1])
        );
        return false;
      }

      file_item = file_item[1];

      console.log("file_item");
      console.log(file_item);
    },
    async getDocLibArr() {
      let get_doc_lib_res = await this.axios
        .get(`/api/efast/v1/entry-doc-lib`)
        .then((get_doc_lib_res) => [null, get_doc_lib_res])
        .catch((err) => [err, null]);

      if (!get_doc_lib_res[1]) {
        // microWidgetProps.components.toast.error(JSON.stringify(name_path[1]));
        this.$microWidgetProps.components.toast.error(
          JSON.stringify(get_doc_lib_res[1])
        );
        return false;
      }

      get_doc_lib_res = get_doc_lib_res[1];

      console.log("get_doc_lib_res.data");
      console.log(get_doc_lib_res.data);

      for (let i = 0; i < get_doc_lib_res.data.length; i++) {
        if (get_doc_lib_res.data[i]["type"] !== "user_doc_lib") {
          this.doc_lib_arr.push(get_doc_lib_res.data[i]["id"]);
        }
      }

      console.log("doc_lib_arr");
      console.log(this.doc_lib_arr);
    },
  },
  async beforeCreate() {
    let metadata_res = await this.axios
      .get(`/api/metadata/v1/templates`)
      .then((metadata_res) => [null, metadata_res])
      .catch((err) => [err, null]);

    if (!metadata_res[1]) {
      // microWidgetProps.components.toast.error(JSON.stringify(name_path[1]));
      this.$microWidgetProps.components.toast.error(
        JSON.stringify(metadata_res[1])
      );
      return false;
    }

    metadata_res = metadata_res[1];

    const type_list = []; // 含有子公司的模板集合
    const company_list = []; // 所有子公司集合

    // 获取元素据模板列表
    for (let i = 0; i < metadata_res.data.entries.length; i++) {
      // 获取子公司的key
      for (let n = 0; n < metadata_res.data.entries[i]["fields"].length; n++) {
        if (
          metadata_res.data.entries[i]["fields"][n]["display_name"] === "子公司"
        ) {
          // 获取含有子公司的模板名称、模板key(id)以及子公司key(id)
          type_list.push({
            id: metadata_res.data.entries[i]["key"], // 模板key
            value: metadata_res.data.entries[i]["display_name"], // 模板名称
            subsidiary_key: metadata_res.data.entries[i]["fields"][n]["key"], //子公司field key
            disable: false,
          });

          for (
            let m = 0;
            m < metadata_res.data.entries[i]["fields"][n]["options"].length;
            m++
          ) {
            company_list.push(
              metadata_res.data.entries[i]["fields"][n]["options"][m]["key"]
            );
          }
        }
      }
    }

    // 去重
    const _company_list = [];
    for (let i = 0; i < company_list.length; i++) {
      if (_company_list.indexOf(company_list[i]) < 0) {
        _company_list.push(company_list[i]);
      }
    }

    // 根据data中company_list格式拼装
    const _company_list_ = [];
    for (let i = 0; i < _company_list.length; i++) {
      _company_list_.push({
        id: i,
        value: _company_list[i],
        disable: false,
      });
    }

    this.metadata = metadata_res.data.entries;
    this.type_list = type_list;
    this.company_list = _company_list_;
    this.template_show = true;
    this.company_show = true;

    console.log("获取到的元素据：");
    console.log(this.metadata);

    console.log("type_list");
    console.log(type_list);
  },
  mounted() {
    this.getDocLibArr();
  },
};
</script>

<style>
html,
body {
  background: #fff !important;
  height: 100% !important;
}

#app {
  background: #fff !important;
  height: 100% !important;
  width: 100% !important;
  margin: 0 !important;
  padding: 0 !important;
}

.el-row {
  margin-bottom: 20px;

  &:last-child {
    margin-bottom: 0;
  }
}

.el-col {
  border-radius: 4px;
}

.bg-purple-dark {
  background: #99a9bf;
}

.bg-purple {
  background: #d3dce6;
}

.bg-purple-light {
  background: #e5e9f2;
}

.grid-content {
  border-radius: 4px;
  min-height: 36px;
}

.row-bg {
  padding: 10px 0;
  background-color: #f9fafc;
}
</style>
